// 微信支付相关方法
import { TipError } from '@common/tip';
import logger from '@common/logger';
import { redirectTo } from '@common/utils';
const wx = window.wx;

/**
 * 执行微信支付
 * @param {Object} prepayRes 预支付订单详情
 * @param {Sting} orderNumber 订单号
 * @param {Function} callback 回调函数
 */
export const invokeWechatPay = (prepayRes, orderNumber, callback) => {
    const errCode = (prepayRes.errCode ? prepayRes.errCode : prepayRes.errorCode) || 0;
    if (errCode) {
        switch (errCode) {
        case 833:
            if (orderNumber) {
                redirectTo(`order/detail/${orderNumber}`);
            } else {
                // 跳转到商城订单列表
                redirectTo('shop-order/list');
            }
            break;
        case 646:
            TipError('执行过反结账的订单不能再进行手机自助付款, 请前往前台使用其他方式付款');
            break;
        default:
            TipError(prepayRes.errMsg || prepayRes.error_message);
            break;
        }
    } else {
        if (prepayRes.useSub) { //子商户模式, 调用旧版支付接口, appId为母商户appId,
            // alert('子商户模式');
            logger.info('进入子商户支付模式');
            // eslint-disable-next-line
            function onBridgeReady() {
                logger.info('执行支付方法');
                // eslint-disable-next-line
                WeixinJSBridge.invoke(
                    'getBrandWCPayRequest', {
                        'appId': prepayRes.appId,           //公众号名称，由商户传入, 子商户模式, appId为母商户appId
                        'timeStamp': prepayRes.timeStamp,   //时间戳，自1970年以来的秒数
                        'nonceStr': prepayRes.nonceStr,     //随机串
                        'package': prepayRes.package,
                        'signType': prepayRes.signType,         //微信签名方式:
                        'paySign': prepayRes.paySign //微信签名
                    },
                    function (res) {
                        logger.success('微信子商户支付结果', res);
                        if (res.err_msg == 'get_brand_wcpay_request:ok') {
                            //支付成功后的回调函数
                            callback && callback(true);
                        } else if (res.err_msg == 'get_brand_wcpay_request:cancel') {
                            callback && callback(false, 'cancel');
                        } else {
                            callback && callback(false, 'fail');
                        } // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok，但并不保证它绝对可靠。
                    }
                );
            }

            if (typeof WeixinJSBridge == 'undefined') {
                if (document.addEventListener) {
                    document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
                } else if (document.attachEvent) {
                    document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
                    document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
                }
            } else {
                onBridgeReady();
            }
        } else { // 直付模式
            // alert('直付模式');
            wx.chooseWXPay({
                timestamp: prepayRes.timeStamp, // 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                nonceStr: prepayRes.nonceStr, // 支付签名随机串，不长于 22 位
                package: prepayRes.package, // 统一支付接口返回的prepay_id参数值，提交格式如:prepay_id=***）
                signType: prepayRes.signType, // 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
                paySign: prepayRes.paySign, // 支付签名
                success: function (res) {
                    // 支付成功后的回调函数
                    callback && callback(true);
                },
                fail: function (res) {
                    // alert('fail' + JSON.stringify(res));
                    callback && callback(false, 'fail');
                },
                complete: function (res) {
                    // alert('complete' + JSON.stringify(res));
                },
                cancel: function (res) {
                    // alert('cancel' + JSON.stringify(res));
                    callback && callback(false, 'cancel');
                },
                trigger: function (res) {
                    // alert('trigger' + JSON.stringify(res));
                }
            });
        }
    }
};

export default invokeWechatPay;
